Perl Perl_0
Perl 「 配列変数 」を変数展開する際の注意点 (0x26)

Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x26 回。
Perl で、配列変数を変数展開する際の注意点について。
「 変数展開 」について
変数展開は、英語で「 Variable interpolation 」と言うそうですが、「 Interpolation 」は「 挿入・差し込み 」や「 改変・改ざん 」、「 補間 」といった意味があるそうです。
「 Perl print 関数の破 (0x04) 」で説明した通り、Perl では主に文字列やリストデータの中に変数を置いて、中身を取り出す(表示する ?) ことを指す様です。
Perl では、「 "" (Double quotation) 」は変数展開が可能で、「 '' (Single quotation) 」は変数展開が不能というシンプルな約束毎があります。
$sun = "haro";
print "Please call me $sun\n"; # 変数展開される
print 'Please call me $sun\n'; # 変数展開されない (改行文字も機能しない)
変数へデータを代入する場合にも、クォーテーションによる動作の違いがありました。
$sun = "haro";
$side7 = "$sun"; # $side7 = haro
$side7 = $sun; # $side7 = haro
$side7 = '$sun'; # $side7 = $sun
変数展開は、スカラ変数だけでなく配列変数にも適用出来ますが、配列変数を変数展開する場合は、スカラ変数よりも少しだけ注意が必要です。
配列変数の変数展開
既に何度か利用していますが、配列変数を文字列の中で変数展開する場合は、次の様にダブルクォーテーションを使って書きます。
@side7 = qw/ amuro fraw kai hayato /;
print "\@side7 = @side7\n"; # Double quotation
3 行目の print 文では配列変数 @side7 に格納された要素を以下の様に表示します。
@side7 = amuro fraw kai hayato
配列の各要素のデータは、空白を挟んで 1 行に表示されます。
ここで挿入される空白は、特殊変数「 $" 」に標準で設定されている値とのことです。つまり、何らかの理由で区切り文字を変更したい場合は、「 $" 」の値を変更することになります。
ここでのポイントは、表示させたい記号「 @ 」を「 \ (バックスラッシュ) 」でエスケープしていることです。
これは「 @ 」が持つ「 シジルの意味 」を打ち消すための処置です。Perl はそれがエスケープされていない限り、配列変数のシジルだとして解釈してしまうからです。
同じ文をシングルクォーテーションで囲むと次の様に表示されます。
\@side7 = @side7\n
シングルクォートの中では、変数展開が行われないだけでなく、バックスラッシュや改行文字もその効力を失います。併せてシジルも効力を失うため、バックスラッシュによるエスケープは不要になります。
スカラ変数と配列変数の区別
配列変数は、次の様にシジルを「 $ 」として「 [ ] 」でインデクスを指定すると、該当する要素の値を単独で表示出来ます。
配列のデータであるにも関わらず、シジルに「 $ 」を使うのは、扱うデータが単数の場合、それはスカラデータとして扱うという Perl のルールがあるからです。
@side7 = qw/ amuro fraw kai hayato /;
print "\$side7[3] = $side7[3]\n"; # $side7[3] = hayato
このルールは、次の様に配列変数とスカラ変数の名前が同じ場合に混乱を呼ぶ可能性があります。
@side7 = qw/ amuro fraw kai hayato /;
$side7 = "Green oasis";
この状況で、「 Side7 is the same the Green oasis[1].」と表示したいとします。つまり、スカラ変数の中身を表示したいと考えます。
print "Side7 is the same the $side7[1].\n";
スカラ変数 $side7 をスペルミスなく指定しましたが、 Perl はこれを「 $side7[1] 」と解釈します。文字列の並び上で、これは当然の結果ですが、希望する結果ではありません。
Side7 is the same the fraw.
この様なミスを防止するために、Perl はいくつかのパターンを用意しています。
print "Side7 is the same the $side7"."[1].\n"; # 文字列を分割する
print "Side7 is the same the $side7\[1]\n"; # [ ] の効力を打ち消す
print "Side7 is the same the ${side7}[1]\n"; # { } で変数名を明示する
これで、望んだ通りの文字列を表示出来る様になります。
Side7 is the same the Green oasis[1].
特に 3 番目の「 { } (ブレース) 」を使ったやり方は、後々まで方々で活用されることになるでしょう。
0x26 -> 0x27 へ
配列の要素へのアクセスする際に、シジル「 $ 」を使うことを「 Perl リストデータ とそれを格納するための 配列変数 (0x1b) 」で「 とまどった 」と書きましたが、今ではすっかり馴染んでいます。
それはやはり「 理解 」が進んだためです。
「 理解 」という言葉は、「 理 」と「 解 」から成っています。
「 理 」は、「 ものごとの筋道 」を意味し、「 解 」は、「 ものごとをばらす 」を意味します。
ということは、対象となる「ものごとの筋道」を「 ばらばら」にした上で得られるものが「 理解 」だということになります。
反対から見ると、ものごとは「 ばらばら 」にしないと「 筋道 」が見えないということです。「 筋道 」が見えないと「 理解 」も出来ません。
「 理解 」が出来れば「 納得 」も出来ます。「 納得 」は様々な思いを「 納め得る 」ことが出来ますので、「 不安 」や「 とまどい 」といった思いにも煩わされることがなくなります。
参考情報は以下の書籍を中心に Wikipedia および各 Web サイト。それと詳しい先輩。
参考 :「Randal L. Schwartz, brian d foy, Tom Phoenix 共著 近藤 嘉雪 訳「初めての Perl 第 6 版」(オライリー・ジャパン発行 ISBN978-4-87311-567-2)」
次回 (0x27) へ続く。
過去記事 RSS
Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)